package _case

import "fmt"

func NewCase() {
	//new函数，可以创建任意类型，并返回指针
	//没有初始化，开辟内存空间，分配指针地址，值为nil
	var i = new(int)
	fmt.Println(*i)
	var slice = new([]string)
	//(*slice)[0] = "a"            //不能赋值，零值为nil
	*slice = append(*slice, "a") //使用append 会初始化赋值（扩容机制）
	if *slice == nil {
		fmt.Println("slice is nil")
	}
	fmt.Println(slice)

	var m = new(map[string]int)
	//(*m)["A"] = 1 //不能赋值，零值为nil
	if *m == nil {
		fmt.Println("m is nil")
	}
	fmt.Println(m)

	userptr := new(User)
	fmt.Println(userptr)
}

// make 仅用于集合map，切片slice，通道chan 的初始化
func MakeCase() {
	//初始化切片，并设置长度和容量
	//slice := make([]int, 0, 20)	//初始化没有分配长度，赋值会报错
	slice := make([]int, 10, 20)
	slice[0] = 1
	slice[1] = 2
	slice = append(slice, 11) //是在长度后面增加值
	fmt.Println(slice)        //[1 2 0 0 0 0 0 0 0 0 11]

	//初始化集合，设置集合大小
	m := make(map[string]int, 0) //设不设置大小不影响使用
	m["a"] = 1
	fmt.Println(m)

	//初始化通道，设置通道的读写方向和缓冲大小
	c1 := make(chan int, 10)   //可读可写
	c2 := make(chan<- int, 10) //仅写
	c3 := make(<-chan int)     //仅读
	fmt.Println(c1, c2, c3)
}

func SliceAndMapCase() {
	var slice []int
	slice = []int{1, 2, 3}
	fmt.Println(slice)

	//slice1 := make([]int, 3, 3)	//容量cap和长度len不能相等，否则容量失效，达不到翻倍扩容的机制
	slice1 := make([]int, 3, 5)
	slice1[0] = 1
	slice1[1] = 2
	slice1[2] = 3
	//slice1[3] = 4		//超出赋值长度会报错
	slice1 = append(slice1, 4, 5, 6) //扩容机制会让容量翻倍
	fmt.Println(slice1)
	//slice len = 6 ,cap = 10
	fmt.Printf("slice len = %d ,cap = %d \n", len(slice1), cap(slice1))

	//切片截取 半开半闭区间，左边闭，右边开
	s1 := slice1[1:2] //从1开始截取
	s2 := slice1[:2]  //从0开始截取
	s3 := slice1[:]   //全部截取
	//s4 := slice1[:12]           //截取超出容量报错
	s4 := slice1[:10]           //只能截取长度范围
	fmt.Println(s1, s2, s3, s4) //

	//切片复制，长度多少复制多少个值，跟容量没关系
	var src = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	var dst = make([]int, 5, 6)
	copy(dst, src)
	fmt.Println(src, dst)
	dst = append(dst, 6, 7, 8)
	fmt.Println(dst)
	fmt.Printf("dst len = %d ,cap = %d \n", len(dst), cap(dst))

	//集合，无序
	m := make(map[string]string)
	m["a"] = "a"
	m["b"] = "b"
	m["c"] = "c"
	m["d"] = "d"
	for k, v := range m {
		fmt.Println(k, v)
	}
	//集合，删除元素
	delete(m, "d")
	fmt.Println(m)
}
